//package com.yueyang.sojourn.server.common.baymax.web.interceptor;
//
//import java.nio.charset.StandardCharsets;
//import javax.servlet.DispatcherType;
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//import org.apache.commons.logging.Log;
//import org.apache.commons.logging.LogFactory;
//import org.springframework.core.annotation.AnnotationUtils;
//import org.springframework.util.StringUtils;
//import org.springframework.web.method.HandlerMethod;
//import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
//
///**
// * 所有被调用的SPI接口方法，我们会检查是否登录过（登录后有Login-UserID）。<br>
// * 目前仅检查网关路由过来的请求，不拦截Feign RPC调用。
// *
// * @author huisman
// * @since 1.0.10
// */
//@SuppressWarnings("rawtypes")
//public class AuthorizedRequestInterceptor extends HandlerInterceptorAdapter {
//  private static final Log logger = LogFactory.getLog(AuthorizedRequestInterceptor.class);
//  private final Class loginNeedlessAnnotation;
//
//  public AuthorizedRequestInterceptor(Class loginNeedlessAnnotationClass) {
//    if (loginNeedlessAnnotationClass == null) {
//      throw new IllegalArgumentException("请指定无需登录的注解");
//    }
//    this.loginNeedlessAnnotation = loginNeedlessAnnotationClass;
//    logger.info(
//        "============**********************************************************************  ================");
//    logger.info("============  启用对网关路由过来的请求的登录检查");
//    logger.info(
//        "============  无需登录校验请在Controller方法中添加：@" + loginNeedlessAnnotationClass.getSimpleName());
//    logger.info(
//        "============***********************************************************************================");
//  }
//
//  @Override
//  @SuppressWarnings("unchecked")
//  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
//      throws Exception {
//    // 仅支持Request请求，内部Include,Forward,error都将被忽略
//    // 如果不是DispatcherType不是正常的Request/ASYNC，则pass
//    DispatcherType dispatchType = request.getDispatcherType();
//    // request类型概率大，放前面
//    if (DispatcherType.REQUEST == dispatchType || DispatcherType.ASYNC == dispatchType) {
//      // **************************** @LoginNeedless ******************************************
//      // 路由节点的ID
//      String routeHeader = request.getHeader("X-Route-By");
//      // 即使 传过来的值为“”也要校验登录token
//      if (routeHeader == null) {
//        // 如果不是api 路由过来的，则直接pass
//        return true;
//      }
//
//      // 判断是否需要授权，仅处理HandlerMethod
//      if (handler instanceof HandlerMethod) {
//        HandlerMethod hm = (HandlerMethod) handler;
//        // 检查method 是否有@LoginNeedless，Spring已做了缓存
//        if (AnnotationUtils.findAnnotation(hm.getMethod(), this.loginNeedlessAnnotation) != null) {
//          return true;
//        }
//
//        // 检查标准请求头，我们需要校验员工是否登录，登录后会有登录人ID
//        String loginUserId = request.getHeader("X-Login-UserId");
//        // 如果需要登录，并且请求还未提交
//        if (!StringUtils.hasText(loginUserId) && !response.isCommitted()) {
//          // first 检查头部是否有工号？
//          response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
//          response.setContentType("application/json;charset=" + StandardCharsets.UTF_8.name());
//
//          StringBuilder message = new StringBuilder(130);
//          message.append("{\"code\":920001,\"message\":\"用户未登录\"").append(",\"timestamp\":")
//              .append(System.currentTimeMillis())
//              .append(",\"path\":\"" + request.getRequestURI() + "\"}");
//
//          response.getWriter().write(message.toString());
//          response.flushBuffer();
//          return false;
//        }
//      }
//    }
//
//    // 默认放行
//    return true;
//  }
//}
//
//
